package br.com.wssa.smmb.controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import br.com.wssa.smmb.entidades.Usuario;
import br.com.wssa.smmb.enums.TipoUsuarioEnum;
import br.com.wssa.smmb.exception.BusinessException;
import br.com.wssa.smmb.exception.ServiceException;
import br.com.wssa.smmb.service.UsuarioService;

/**
 * Classe UsuarioController.
 * @author ssilva
 */
@Controller("usuario")
@SessionAttributes("usuario")
public class UsuarioController {

	@Autowired
	private UsuarioService usuarioService;
	
	/**
	 * @param usuario
	 * @param bindingResult
	 * @param sessao
	 * @return
	 */
	@RequestMapping(value = "/cadastrarPessoaFisica", method = RequestMethod.POST)
	public ModelAndView cadastrarPessoaFisica(Usuario usuario, HttpSession sessao) {
		ModelAndView modelView = new ModelAndView("/registro");
		modelView.addObject("j_username", usuario.getEmail());
		modelView.addObject("j_password", usuario.getSenha());
		modelView.addObject("registroInvalido", false);
		modelView.addObject("tipoUsuario", TipoUsuarioEnum.PESSOA_FISICA);
		
		try {
			usuarioService.cadastrarPessoaFisica(usuario);
		} catch (BusinessException e) {
			modelView.addObject("registroInvalido", true);
			modelView.addObject("mensagem", e.getMensagem());
		} catch (ServiceException e) {
			modelView.addObject("registroInvalido", true);
			modelView.addObject("mensagem", e.getMensagem());
		}
		return modelView;
	}

	
	/**
	 * @param usuario
	 * @param bindingResult
	 * @param sessao
	 * @return
	 */
	@RequestMapping(value = "/cadastrarPessoaJuridica", method = RequestMethod.POST)
	public ModelAndView cadastrarPessoaJuridica(Usuario usuario, HttpSession sessao) {
		ModelAndView modelView = new ModelAndView("/registro");
		modelView.addObject("j_username", usuario.getEmail());
		modelView.addObject("j_password", usuario.getSenha());
		modelView.addObject("registroInvalido", false);
		modelView.addObject("tipoUsuario", TipoUsuarioEnum.PESSOA_JURIDICA);
		try {
			usuarioService.cadastrarPessoaJuridica(usuario);
		} catch (BusinessException e) {
			modelView.addObject("registroInvalido", true);
			modelView.addObject("mensagem", e.getMensagem());
		} catch (ServiceException e) {
			modelView.addObject("registroInvalido", true);
			modelView.addObject("mensagem", e.getMensagem());
		}
		return modelView;
	}
	
	/**
	 * Mapeamento de autenticação.
	 * Reparem que neste ponto definimos que apenas POST será aceito no processo
	 * de autenticação
	 * 
	 * Para lidar com sessões, tudo o que precisamos fazer é incluir na chamada do método um atributo do tipo
	 * HttpSession.
	 * @param email
	 * @param senha
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public ModelAndView login(@RequestParam("j_username") String email, @RequestParam("j_password") String senha) {
		ModelAndView modelView = new ModelAndView("/entrar");
		modelView.addObject("j_username", email);
		modelView.addObject("j_password", senha);
		modelView.addObject("loginInvalido", false);
		try {
			usuarioService.validarLogin(email, senha);
		} catch (BusinessException e) {
			modelView.addObject("loginInvalido", true);
			modelView.addObject("mensagem", e.getMensagem());
		} catch (ServiceException e) {
			modelView.addObject("loginInvalido", true);
			modelView.addObject("mensagem", e.getMensagem());
		}
		return modelView;
	}

	/**
	 * logout.
	 * @param session HttpSession
	 * @return String
	 */
	@RequestMapping("/logout")
	public String logout(HttpSession session) {
		session.invalidate();
		return "redirect:/";
	}
	
	
	@RequestMapping(value = "/esqueciSenha", method = RequestMethod.POST)
	public ModelAndView esqueciSenha(@RequestParam("email") String email){
		ModelAndView modelView = new ModelAndView("/loginFalho");
		modelView.addObject("email", email);
		try {
			usuarioService.enviarNovaSenha(email);
		} catch (BusinessException e) {
			modelView.addObject("mensagem", e.getMensagem());
		} catch (ServiceException e) {
			modelView.addObject("mensagem", e.getMensagem());
		}
		return modelView;
	}
}